package cn.hrbnu.service.impl;

import cn.hrbnu.mapper.ArticleMapper;
import cn.hrbnu.mapper.CategoryMapper;
import cn.hrbnu.po.Article;
import cn.hrbnu.service.ArticleService;
import cn.hrbnu.util.ResponseResult;
import cn.hrbnu.vo.ArticleDetailVo;
import cn.hrbnu.vo.ArticleListVo;
import cn.hrbnu.vo.HotArticleVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ArticleServiceImpl implements ArticleService {

    private final ArticleMapper articleMapper;

    private final CategoryMapper categoryMapper;

    final
    RedisTemplate<Object, Object> redisTemplate;

    public ArticleServiceImpl(ArticleMapper articleMapper, CategoryMapper categoryMapper, RedisTemplate<Object, Object> redisTemplate) {
        this.articleMapper = articleMapper;
        this.categoryMapper = categoryMapper;
        this.redisTemplate = redisTemplate;
    }

    /**
     * 获取热门文章列表
     * <p>
     *本方法通过调用ArticleMapper中的hotArticleList方法来获取数据库中最热门的10篇文章，
     * 并将这些文章信息转换为HotArticleVo对象列表，以便于前端展示或进一步处理
     *
     * @return 返回包含热门文章信息的ResponseResult对象，包括状态码、操作成功消息及文章列表
     */
    @Override
    public ResponseResult<Object> hotArticleList() {
        //获取10热门文章
        List<Article> list = articleMapper.hotArticleList();

        //创建一个HotArticleVo列表，用于存储转换后的热门文章信息
        List<HotArticleVo> hotArticleVos = new ArrayList<>();
        for (Article article : list) {
            //将Article对象的属性值复制到HotArticleVo对象中
            HotArticleVo hotArticleVo = new HotArticleVo();
            BeanUtils.copyProperties(article, hotArticleVo);
            //将转换后的HotArticleVo对象添加到列表中
            hotArticleVos.add(hotArticleVo);
        }

        //返回包含状态码、操作成功消息及热门文章列表的ResponseResult对象
        return new ResponseResult<>(200, "操作成功", hotArticleVos);
    }

    /**
     * 文章列表接口的实现方法
     * 该方法用于分页查询指定分类下的文章列表
     *
     * @param pageNum    页码，表示请求的文章列表的页数
     * @param pageSize   每页大小，表示每页包含的文章数量
     * @param categoryId 分类ID，表示要查询的文章所属的分类
     * @return 返回包含文章列表和总记录数的ResponseResult对象
     */
    @Override
    public ResponseResult<Object> articleList(Integer pageNum, Integer pageSize, Long categoryId) {
        // 启用分页功能，配置当前页和每页大小
        PageHelper.startPage(pageNum, pageSize);
        // 调用ArticleMapper中的articleList方法，获取指定分类下的文章列表
        List<Article> list = articleMapper.articleList(categoryId);

        // 创建PageInfo对象，用于封装分页查询的结果
        PageInfo<Article> pageInfo = new PageInfo<>(list);
        // 获取总记录数
        long total = pageInfo.getTotal();


        // 创建一个ArrayList，用于存储转换后的文章列表
        List<ArticleListVo> listVos = new ArrayList<>();
        // 遍历查询到的文章列表
        for (Article article : list) {
            // 创建一个新的ArticleListVo对象
            ArticleListVo articleListVo = new ArticleListVo();
            // 将Article对象的属性复制到ArticleListVo对象中
            BeanUtils.copyProperties(article, articleListVo);
            // 通过类别ID获取类别名称，并设置到ArticleListVo对象中
            String name = categoryMapper.getByIdName(article.getCategoryId());
            articleListVo.setCategoryName(name);
            // 将转换后的ArticleListVo对象添加到列表中
            listVos.add(articleListVo);
        }


        // 创建一个HashMap，用于存储分页查询的结果
        Map<String, Object> map = new HashMap<>();
        // 将文章列表放入map中，键为"rows"
        map.put("rows", listVos);
        // 将总记录数放入map中，键为"total"
        map.put("total", total);


        // 创建并返回一个新的ResponseResult对象，包含状态码、操作成功消息和查询结果
        return new ResponseResult<>(200, "操作成功", map);
    }

    /**
     * 获取文章详情
     *
     * @param id 文章ID，用于查询指定文章的详细信息
     * @return ResponseResult 包含文章详情的对象，用于向客户端返回操作结果
     */
    @Override
    public ResponseResult<Object> getArticleDetail(Long id) {
        // 查询文章数据
        Article article = articleMapper.getById(id);
        // 查询分类数据
        String name = categoryMapper.getByIdName(article.getCategoryId());
        // 封装数据
        ArticleDetailVo articleDetailVo = new ArticleDetailVo();
        BeanUtils.copyProperties(article, articleDetailVo);
        articleDetailVo.setCategoryName(name);
        // 返回
        return new ResponseResult<>(200, "操作成功", articleDetailVo);
    }
}
